package ru.study.thinkin.chapter10;

//Product
abstract class Product {
}

// ConcreteProductA
class ConcreteProductA extends Product {
}

// ConcreteProductB
class ConcreteProductB extends Product {
}

// Creator
abstract class Creator {
  public abstract Product factoryMethod();
}

// У этого класса может быть любое кол-во наследников.
// Для создания нужного нам объекта можно написать следующие Фабрики:
//ConcreteCreatorA, ConcreteCreatorB

// ConcreteCreatorA
class ConcreteCreatorA extends Creator {
  @Override
  public Product factoryMethod() {
      return new ConcreteProductA();
  }
}

// ConcreteCreatorB
class ConcreteCreatorB extends Creator {
  @Override
  public Product factoryMethod() {
      return new ConcreteProductB();
  }
}

public class FactoryMethodExample {

  public static void main(String[] args) {
      // an array of creators
      Creator[] creators = {new ConcreteCreatorA(), new ConcreteCreatorB()};

      // iterate over creators and create products
      for (Creator creator: creators) {
          Product product = creator.factoryMethod();
          System.out.printf("Created {%s}\n", product.getClass());
      }
  }
}